---
id: udpwaitingclient
title: Udp同步请求
---

### 定义

命名空间：TouchSocket.Sockets <br/>
程序集：[TouchSocket.dll](https://www.nuget.org/packages/TouchSocket)

## 一、说明

有很多小伙伴对于Udp一直有一些需求：

1. 客户端发送一个数据，然后等待服务器回应。
2. 服务器向客户端发送一个数据，然后等待客户端回应。

那针对这些需求，可以使用**WaitingClient。**其内部实现了**IWaitSender**接口，能够在发送完成后，等待返回。

## 二、创建及使用

### 2.1 以UdpSession为例

```csharp showLineNumbers
var udpSession = new UdpSession();
var config = new TouchSocketConfig()
    .UseUdpReceive()//必要设置
    .SetRemoteIPHost(new IPHost("127.0.0.1:7789"));//可以不设置

//载入配置
udpSession.Setup(config);
udpSession.Start();

//调用CreateWaitingClient获取到IWaitingClient的对象。
var waitClient = udpSession.CreateWaitingClient(new WaitingOptions()
{
    RemoteIPHost = new IPHost("127.0.0.1:7799")//表示目的地址
});

//然后使用SendThenReturn。
byte[] returnData = waitClient.SendThenReturn(Encoding.UTF8.GetBytes("RRQM"));
udpSession.Logger.Info($"收到回应消息：{Encoding.UTF8.GetString(returnData)}");

//同时，如果适配器收到数据后，返回的并不是字节，而是IRequestInfo对象时，可以使用SendThenResponse.
ResponsedData responsedData = waitClient.SendThenResponse(Encoding.UTF8.GetBytes("RRQM"));
IRequestInfo requestInfo = responsedData.RequestInfo;//同步收到的RequestInfo
```

:::caution 注意

Udp的同步请求，有两种策略，一种则是在配置中设置**SetRemoteIPHost**，然后在**CreateWaitingClient**时则不必再设置RemoteIPHost，这种情况一般适用于客户端。第二种则是不配置**SetRemoteIPHost**，然后在**CreateWaitingClient**时设置RemoteIPHost，这种情况适用于服务器。

:::  

:::tip 提示

在SendThenReturn时，通过其他参数，还可以设置Timeout，以及可取消的等待Token。

:::  

:::tip 提示

实际上上述行为，只要实现IClient, IDefaultSender, ISend三个接口的类均可以使用。

:::  

:::danger 注意事项

1. 发送完数据，在等待时，如果收到其他返回数据，则可能得到错误结果。
2. 发送采用Lock锁，一个事务没结束，另一个请求也发不出去。
3. 在**Net461及以下**版本中，SendThenReturn与SendThenReturnAsync不能混合使用。即：要么全同步，要么全异步。

:::